#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <time.h>

int main(int argc, char**argv)
{
    //获取文件属性
    struct stat st;
    int re = lstat(argv[1], &st);
    if(re == -1)
    {
        perror("lstat error");
        return -1;
    }

    //分析
    //文件类型
    if(S_ISREG(st.st_mode))
    {
        printf("-");
    }
    else if(S_ISDIR(st.st_mode))
    {
        printf("d");
    }
    else if(S_ISCHR(st.st_mode))
    {
        printf("c");
    }
    else if(S_ISFIFO(st.st_mode))
    {
        printf("p");
    }
    else if(S_ISLNK(st.st_mode))
    {
        printf("l");
    }
    else if(S_ISBLK(st.st_mode))
    {
        printf("b");
    }
    else if(S_ISSOCK(st.st_mode))
    {
        printf("s");
    }
    //文件权限
    //用户
    if(st.st_mode & S_IRUSR)
    {
        //user 具有 可读的权限
        printf("r");
    }
    else
    {
        //user 不具有 可读的权限
        printf("-");
    }
    if(st.st_mode & S_IWUSR)
    {
        //user 具有 可读的权限
        printf("w");
    }
    else
    {
        //user 不具有 可读的权限
        printf("-");
    }
    if(st.st_mode & S_IXUSR)
    {
        //user 具有 可读的权限
        printf("x");
    }
    else
    {
        //user 不具有 可读的权限
        printf("-");
    }
    //组用户
    if(st.st_mode & S_IRGRP)
    {
        //user 具有 可读的权限
        printf("r");
    }
    else
    {
        //user 不具有 可读的权限
        printf("-");
    }
    if(st.st_mode & S_IWGRP)
    {
        //user 具有 可读的权限
        printf("w");
    }
    else
    {
        //user 不具有 可读的权限
        printf("-");
    }
    if(st.st_mode & S_IXGRP)
    {
        //user 具有 可读的权限
        printf("x");
    }
    else
    {
        //user 不具有 可读的权限
        printf("-");
    }
    //其他用户
    if(st.st_mode & S_IROTH)
    {
        //user 具有 可读的权限
        printf("r");
    }
    else
    {
        //user 不具有 可读的权限
        printf("-");
    }
    if(st.st_mode & S_IWOTH)
    {
        //user 具有 可读的权限
        printf("w");
    }
    else
    {
        //user 不具有 可读的权限
        printf("-");
    }
    if(st.st_mode & S_IXOTH)
    {
        //user 具有 可读的权限
        printf("x");
    }
    else
    {
        //user 不具有 可读的权限
        printf("-");
    }

    //硬连接数
    printf(" %ld", st.st_nlink);

    //用户ID  组ID
    printf(" %d %d", st.st_uid, st.st_gid);

    //文件大小
    printf(" %ld", st.st_size);

    //修改内容的时间
    struct tm *tm = localtime(&st.st_mtime);

    printf(" %d月 %d %d:%d", tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min);

    //文件名
    printf(" %s\n", argv[1]);

}